# coding:utf-8
import os
from dataclasses import dataclass
from typing import Callable, Dict, List
from PyQt6.QtWidgets import QWidget, QLayout
from qfluentwidgets import CardWidget


@dataclass
class FormItemDto:
    """表单项数据传输对象"""

    # 表单描述
    form_desc: str

    # 表单主键
    form_key: str

    # 表单值
    form_value: str = ""

    # 表单值类型
    form_value_type: str = "text"

    # 表单最大值
    form_max: int = None

    # 表单最小值
    form_min: int = None

    # 表单关联表
    form_table: str = ""


@dataclass
class TableDataDto:
    """表格数据传输对象"""

    # 表格头
    table_header: List[str]

    # 表格明细
    table_data: List[List[str]]

    # 操作按钮 : value 是回调函数 ，接收一个字符串 ， 返回一个 message
    table_item_fun: List[Dict[str, Callable[[str], str]]]


@dataclass
class ComponentConfig:
    """用于存储每个组件的配置"""

    component_type: str  # 组件类型，如 "QLineEdit", "PushButton", 等
    callback: Callable  # 回调函数
    kwargs: Dict = None  # 额外的配置信息，如按钮名称、宽度等

    def __post_init__(self):
        """确保 kwargs 总是一个字典，即使没有传递 kwargs 参数"""
        if self.kwargs is None:
            self.kwargs = {}


@dataclass
class WidgetTemplateResultDto:
    """表格模板结果DTO，用于封装addTableTemplate方法的返回结果"""

    inner: QWidget  # 表格组件实例

    card: CardWidget  # 卡片组件实例

    target_layout: QLayout  # 目标布局实例

    style_file: str = ""  # 组件专属的QSS样式文件路径

    def apply_style(self):
        """应用组件专属的QSS样式"""
        if self.style_file and os.path.exists(self.style_file):
            with open(self.style_file, "r", encoding="utf-8") as f:
                style_sheet = f.read()
                # 应用样式到内部组件
                self.inner.setStyleSheet(style_sheet)
                # 如果卡片与内部组件不同，也应用样式到卡片
                if self.card != self.inner:
                    self.card.setStyleSheet(style_sheet)
